import { useStore } from '@/store'
import axios, { AxiosRequestConfig, Method } from 'axios'
import { endsWith } from 'lodash-es'
// import NProgress from "nprogress";
// import "nprogress/nprogress.css";

export interface Response<T> {
  data: T
  code: number
  message: string
}

export type Options<V, R, P> = Partial<AxiosRequestConfig>

// 创建 axios 实例   dev使用: "http://39.105.55.151:7001" prod使用："/"
const request = axios.create({
  baseURL: import.meta.env.VITE_API_BASE,  // 从环境变量中读取 baseURL
  timeout: import.meta.env.VITE_TIMEOUT || 5000, // 设置默认超时时间
  withCredentials: false
})

// 请求队列
let queue: Array<(token: string) => void> = []
// 是否刷新中
let isRefreshing = false
// 请求拦截器
request.interceptors.request.use(
  (req) => {
    // 请求进度条
    // NProgress.start();
    // 请求信息
    if (req.url && import.meta.env.DEV) {
      // console.group(req.url)
      // console.log('method:', req.method)
      // console.table('data:', req.method === 'get' ? req.params : req.data)
      // console.groupEnd()
    }
    // 验证 token
    const { user } = useStore()
    if (user.token) {
      // 请求标识
      // if (req.headers && req.headers['token'] !== null) {
      req.headers['token'] = user.token
      // }

      // 忽略
      if (['refreshToken'].some((e) => endsWith(req.url, e))) {
        return req
      }

      // 判断 token 是否过期
      // if (storage.isExpired('token')) {
      //   Snackbar.error('登录状态已失效，请重新登录')
      //   user.logout()
      //   return Promise.reject(new Error('Token expired'))
      //   // if (storage.isExpired('refreshToken')) {
      //   //   Snackbar.error('登录状态已失效，请重新登录')
      //   //   user.logout()
      //   // } else {
      //   //   // 是否在刷新中
      //   //   if (!isRefreshing) {
      //   //     isRefreshing = true

      //   //     user
      //   //       .refreshToken()
      //   //       .then((token) => {
      //   //         queue.forEach((cb) => cb(token))
      //   //         queue = []
      //   //         isRefreshing = false
      //   //       })
      //   //       .catch(() => {
      //   //         user.logout()
      //   //       })
      //   //   }

      //   //   return new Promise((resolve) => {
      //   //     // 继续请求
      //   //     queue.push((token) => {
      //   //       // 重新设置 token
      //   //       if (req.headers) {
      //   //         req.headers['Authorization'] = token
      //   //       }
      //   //       resolve(req)
      //   //     })
      //   //   })
      //   // }
      // }
    }

    return req
  },
  (error) => {
    // NProgress.done();
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (res) => {
    // NProgress.done();
    if (!res?.data) {
      return res
    }

    const { code, data, message } = res.data

    if (!code) {
      return res.data
    }

    switch (code) {
      case 1000:
        return data
      default:
        console.error("request interceptors response code!=1000:", message)
        return Promise.reject({ code, message })
    }
  },
  async (error) => {
    // NProgress.done();
    if (error.response) {
      const { status, data } = error.response
      const { user } = useStore()
      if (status == 401) {
        // 退出登录逻辑
        user.logout()
        Snackbar.error(data.message + '请重新登录')
      } else {
        // !isDev
        // if (!isDev) {
        // 	switch (status) {
        // 		case 403:
        // 			router.push("/403");
        // 			break;
        // 		case 500:
        // 			router.push("/500");
        // 			break;
        // 		case 502:
        // 			router.push("/502");
        // 			break;
        // 	}
        // }
      }
      // console.error("request interceptors response error:", error.response)
      // Snackbar.error(data.message || '请求失败')
    }
    return Promise.reject({ message: error.message })
  }
)

// 通用 API 函数
export function api(url: string, method: Method) {
  function load<V, P = Record<string, any>>(params?: P, config?: AxiosRequestConfig): Promise<Response<V>> {
    return request({
      url,
      method,
      ...config,
      params: method.toLowerCase() === 'get' ? params : undefined,
      data: method.toLowerCase() !== 'get' ? params : undefined
    })
  }

  function use<V, RV = V, P = Record<string, any>>(options: Options<V, RV, P> = {}) {
    const config = { url, method, ...options } as AxiosRequestConfig
    return load<V, P>(config.params as P, config)
  }

  return {
    url,
    load,
    use
  }
}

export { request }
